import pandas as pd
from datetime import datetime


def get_age_from_idcard(idcard):
    """
    根据身份证号获取年龄。身份证号需要是18位。
    :param idcard: 身份证号
    :return: 年龄
    """
    # 提取出生年份（身份证号第7到第10位）
    birth_year = int(idcard[6:10])

    # 提取出生月份和日期（身份证号第11到第12位为月份，第13到第14位为日期）
    birth_month = int(idcard[10:12])
    birth_day = int(idcard[12:14])

    # 获取当前日期
    current_date = datetime.now()

    # 计算年龄
    age = current_date.year - birth_year

    # 判断是否已经过了生日，如果没有过生日则减去1
    if current_date.month < birth_month or (current_date.month == birth_month and current_date.day < birth_day):
        age -= 1

    return age


def error1_idf(df,dict_info_setting , columns):
    """
    检查血压数据及随访分类，返回样式和批注信息。
    columns应包含收缩压、舒张压、随访分类、身份证号的列名。
    """

    sbp_dbp = [int(info.strip()) for info in dict_info_setting['error1_idf'].split(':')[-1].split(',')]


    styles_info = {}# 样式信息
    comments_info = []# 批注信息

    column1, column2, column3, column4 = columns  # 解析列名

    for row_idx, row in df.iterrows():
        try:
            systolic = row[column1]# 收缩压
            diastolic = row[column2]# 舒张压
            follow_up = row[column3]# 随访分类
            idcard = row[column4]# 身份证号

            # 跳过空值或无效数据
            if pd.isnull([systolic, diastolic, follow_up, idcard]).any():
                continue

            # 从身份证获取年龄
            age = get_age_from_idcard(idcard)# 获取年龄
            if age is None:
                continue  # 无效身份证号

            if follow_up == "控制满意":
                # 判断年龄对应的标准（注意：这里保持原标准值）
                if age < 65:
                    standard_sys = 140
                    standard_dia = 90
                else:
                    standard_sys = 150
                    standard_dia = 90
                # 调整判断逻辑：
                # 收缩压严格大于标准值才算超标（140不触发）
                # 舒张压大于等于标准值即超标（90触发）
                sys_failed = systolic > standard_sys  # 改为 > 而非 >=
                dia_failed = diastolic >= standard_dia  # 保持 >=
                # 仅当任一血压超标时处理
                if sys_failed or dia_failed:
                    comment_parts = []

                    # 收缩压超标时的处理
                    if sys_failed:
                        comment_parts.append(f"收缩压 {systolic} > {standard_sys} mmHg")
                        # 添加收缩压列批注并标黄
                        comments_info.append((
                            row_idx,
                            column1,
                            f"收缩压超标但是控制满意（当前值: {systolic}, 标准: ≤{standard_sys} mmHg）"
                        ))
                        key = (row_idx, column1)
                        if styles_info.get(key, '') != 'error':
                            styles_info[key] = 'warning'
                    # 舒张压超标时的处理
                    if dia_failed:
                        comment_parts.append(f"舒张压 {diastolic} ≥ {standard_dia} mmHg")
                        # 添加舒张压列批注并标黄
                        comments_info.append((
                            row_idx,
                            column2,
                            f"舒张压超标但是控制满意（当前值: {diastolic}, 标准: <{standard_dia} mmHg）"
                        ))
                        key = (row_idx, column2)
                        if styles_info.get(key, '') != 'error':
                            styles_info[key] = 'warning'
                    # 随访分类列添加汇总批注（不标黄）
                    if len(comment_parts) > 0:
                        summary_comment = (
                            f"年龄{age}岁，血压未达标（标准: 收缩压≤{standard_sys}/舒张压<{standard_dia} mmHg），"
                            f"但分类为'控制满意'。具体问题：{'，'.join(comment_parts)}"
                        )
                        comments_info.append((row_idx, column3, summary_comment))

            # 处理收缩压绝对范围（错误级别）
            if systolic < sbp_dbp[1] or systolic > sbp_dbp[0]:
                styles_info[(row_idx, column1)] = 'error'
                comments_info.append((row_idx, column1,
                                      f"收缩压值{systolic}不符合合理范围（90-180 mmHg）"))

            # 处理舒张压绝对范围（错误级别）
            if diastolic < sbp_dbp[3] or diastolic > sbp_dbp[2]:
                styles_info[(row_idx, column2)] = 'error'
                comments_info.append((row_idx, column2,
                                      f"舒张压值{diastolic}不符合合理范围（60-110 mmHg）"))

        except Exception as e:
            print(f"行 {row_idx + 2} 处理异常: {str(e)}")
            continue

    return styles_info, comments_info# 返回样式和批注信息


